#混合参数
#传参顺序：必选参数、默认参数、可变参数、命名关键字和关键字参数
from functools import reduce


def order(a,b=10,*c,d=20):
    print(f'a={a},b={b},c={c},d={d}')
order(1,2,3,4,5,6)#a=1,b=2,c=(3, 4, 5, 6),d=20，注意d没有被传参
#函数内部调用：一个函数里调用另一个函数或者递归
#def a():
#    print('a')
#def b():
#    print('b')
#    a()
#b()#输出b \n a
#嵌套：在一个函数内定义另一个函数（强烈谴责）
#总之，上面的代码也能够写成这样：
#def b():
#    print('b')
#    def a():
#        print('a')
#    a()
#b()#输出b \n a,注意函数a的作用域不同
'''
times=1
import random
print('游戏方式：每次输入掷骰子次数，随机数掷骰子并计算总和')
def random_play(total):#哎，z批
    sum1=0
    for i in range(total):
        temp=random.randint(1,6)
        print(f'第{i+1}次结果为{temp}')
        sum1+=temp
    print(f'{total}次结果的总和为{sum1}')
while times>0:
    times=int(input('输入游玩次数（输入0表示结束）'))
    if times>0:
        random_play(times)
'''

#递归
list1=[]
def whether(a):
    if a<=2:
        return a-1
    else :
        return whether(a-1)+whether(a-2)
n=int(input('输入斐波那契数列前n项'))
for i in range(1,n+1):
    list1.append(whether(i))
add=lambda x,y:x+y
print(f'结果为{list1}')
print(f'总和为：{reduce(add,list1)}')
#定义域：全局变量和局部变量，学过C的话不多解释
#名称空间：分为内置名称空间、全局名称空间和局部名称空间（上次听见命名空间还是using namespace std;）
#变量查找的顺序：局部名称空间->全局名称空间->内置名称空间
'''特别注意：由于先局部再全局，所以按照C的手法在函数内部改变全局变量的值会被认为是定义了一个与全局变量名称相同的局部变量
'''
#global:声明为全局变量
#example:
a=1
def xa():
    a=2
    print(a)
xa()#输出2
print(a)#输出1
#def xb():
#    print(a)
#    a=2
#观察到先打印再赋值会报错
#不报错的方法：
def xb():
    global a
    print(a)
    a=2
xb()#输出1
print(a)#输出2
#总结：比起c在函数内引用全局变量多一步
#注意：可变对象的值改变时地址不变，所以函数内部直接修改可变对象不需要声明为全局变量
#nonlocal:声明为上一级变量（不能用于声明为全局变量）
